From b752ccb8d2a7cf83012fe99610bf331e390ed112 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Wed, 17 May 2006 16:31:46 -0600 Subject: [PATCH] [IA64] pte_xchg added pte_xchg added to atomically exchange pte. Signed-off-by: Tristan Gingold --- xen/arch/ia64/xen/domain.c | 8 +++++--- xen/include/asm-ia64/linux-xen/asm/pgtable.h | 12 ++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index cb32d01ff9..dd241f6db8 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -746,6 +746,7 @@ __assign_new_domain_page(struct domain *d, unsigned long mpaddr, pte_t* pte) set_pte(pte, pfn_pte(maddr >> PAGE_SHIFT, __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX))); + mb (); //XXX CONFIG_XEN_IA64_DOM0_VP // TODO racy set_gpfn_from_mfn(page_to_mfn(p), mpaddr >> PAGE_SHIFT); @@ -803,6 +804,7 @@ __assign_domain_page(struct domain *d, set_pte(pte, pfn_pte(physaddr >> PAGE_SHIFT, __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX))); + mb (); } else printk("%s: mpaddr %lx already mapped!\n", __func__, mpaddr); } @@ -1123,13 +1125,13 @@ assign_domain_page_replace(struct domain *d, unsigned long mpaddr, struct mm_struct *mm = &d->arch.mm; pte_t* pte; pte_t old_pte; + pte_t npte; pte = lookup_alloc_domain_pte(d, mpaddr); // update pte - old_pte = ptep_get_and_clear(mm, mpaddr, pte); - set_pte(pte, pfn_pte(mfn, - __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX))); + npte = pfn_pte(mfn, __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX)); + old_pte = ptep_xchg(mm, mpaddr, pte, npte); if (!pte_none(old_pte)) { unsigned long old_mfn; struct page_info* old_page; diff --git a/xen/include/asm-ia64/linux-xen/asm/pgtable.h b/xen/include/asm-ia64/linux-xen/asm/pgtable.h index dde4964830..54539200c2 100644 --- a/xen/include/asm-ia64/linux-xen/asm/pgtable.h +++ b/xen/include/asm-ia64/linux-xen/asm/pgtable.h @@ -397,6 +397,18 @@ ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) #endif } +static inline pte_t +ptep_xchg(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t npte) +{ +#ifdef CONFIG_SMP + return __pte(xchg((long *) ptep, pte_val(npte))); +#else + pte_t pte = *ptep; + set_pte (ptep, npte); + return pte; +#endif +} + #ifndef XEN static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) -- 2.30.2